/*
一，输出10，因为i为全局变量，for循环结束后i的值为10
二，会报错，因为在if语句块内用let声明了tmp变量，所以tmp不会指向外部全局的tmp，
    但if语句块内的tmp在声明之前就使用了，所以会报错
三，let min = Math.min(...arr)
四，var:全局作用域，变量提升
    let:块级作用域，不存在变量提升
    const: 块级作用域，不存在变量提升，声明赋值之后值不可修改
五，20，因为setTimeout回调这里使用了箭头函数，所以箭头函数内的this会绑定函数定义时的对象，这里就是obj对象本身
六，用于创建一个独一无二的值，该值可作为对象属性名，防止覆盖对象原有属性
七，深浅拷贝都是针对引用对象来说的
    浅拷贝：简单的对象地址拷贝，拷贝前后两个对象是全等的
    深拷贝：按照原对象的值，重新生成一个对象，两个对象地址不一样，但是各属性值完全一样
八，TypeScript是JavaScript的超集，TypesScript在编译阶段增加了类型检查，可以使代码错误提前报出，
   也增加了一些面向对象语言的数据类型，具有更有的可维护性。TypeScript编译后为JavaScript
九，优点：1，增加类型检查 2，新增数据类型 3，增强可维护性
    缺点：有一点学习成本(和C#非常像)
十，当初始化一个对象时，该对象引用计数为0，当该对象被引用次数增加一次时，引用计数也加1，
    当该对象被引用次数减少一次时，引用计数相应减一，当引用计数变成0时，该对象即被回收
    优点：回收比较及时，引用计数为0立即被回收
    缺点：循环引用对象会造成内存泄漏
十一，当GC进行垃圾回收时，先会对所有依旧被引用的对象做一个标记，如果对象没有被标记，则对象占用内存空间将被释放。
    释放后会形成内存空间碎片化，这时就需要对碎片化内存空间做一次整理，将剩余空间汇集成一段连续地址，方便下次分配使用
十二，在新生代空间中，内存空间分为两部分，分别为 From 空间和 To 空间。在这两个空间中，必定有一个空间是使用的，另一个空间是空闲的。
    新分配的对象会被放入 From 空间中，当 From 空间被占满时，新生代 GC 就会启动了。算法会检查 From 空间中存活的对象并复制到 To 空间中，
    如果有失活的对象就会销毁。当复制完成后将 From 空间和 To 空间互换，这样 GC 就结束了
十三，解决GC标记清楚的长停顿问题，即由于垃圾太多，GC清理了好久没都清理完，影响程序的正常执行。
    原理：增量与全量相对，即每次只处理小部分的对象，增加一种标记，即有如下三种状态
    1，白色：未搜索过的对象
    2，灰色：正在搜索的对象
    3，黑色：搜索完的对象
    在GC开始执行时, 所有对象都是白色的, 然后将根集合的对象放到栈中, 并标记为灰色, 依次处理. 将对象从栈中取出, 
    递归搜索所有子对象, 并标记为灰色, 当子对象搜索完后, 就将对象标记为黑色. 这样, 当一个对象搜索完后, 
    该对象及其关联的所有子对象就都是黑色的了. 当标记阶段结束后, 所有活动对象都是黑色, 垃圾对象则是白色.

*/